package cn.hongxin.sap.conn.example;

import cn.hongxin.sap.conn.dto.DemoDto;
import cn.getech.poros.framework.common.api.RestResponse;
import cn.getech.poros.framework.common.api.ResultCode;
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

/**
 * @author hengji.li@getech.cn
 * @date 2020/2/21
 */
@Service
@Slf4j
public class TestService {

    /**
     * @SentinelResource 注解用来标识资源是否被限流、降级。
     * sayHello 表示资源名。
     *
     * 若不配置 blockHandler、fallback 等函数，则被流控降级时方法会直接抛出对应的 BlockException；
     * 具体可参见文档：https://github.com/alibaba/Sentinel/wiki/%E6%B3%A8%E8%A7%A3%E6%94%AF%E6%8C%81
     * @param name
     * @return
     */
    @SentinelResource(value = "hello", blockHandler = "exceptionHandler", fallback = "helloFallback")
    public DemoDto sayHello(String name) {

        return DemoDto.builder().age(20).name("Hello " + name).build();
    }

    /**
     * Fallback 函数，函数签名与原函数一致或加一个 Throwable 类型的参数.
     * @param s
     * @return
     */
    public RestResponse helloFallback(String s) {
        return RestResponse.failed(ResultCode.FAILURE.getCode(),"fallback "+ s);
    }

    /**
     * Block 异常处理函数，参数最后多一个 BlockException，其余与原函数一致.
     * @param s
     * @param ex
     * @return
     */
    public RestResponse exceptionHandler(String s, BlockException ex) {
        return RestResponse.failed(ResultCode.FAILURE.getCode(),"Oops, error occurred at " + s);
    }
}